home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / programm.ing / sources.arc / DUBLINE.C < prev    next >
Encoding:
C/C++ Source or Header  |  1994-03-22  |  5.4 KB  |  250 lines

  1. #include <linea.h>
  2. #include <osbind.h>
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15. /* symmetric double step line algorithm */
  16.  
  17. #define swap(a,b)   { a^=b; b^=a; a^=b; }
  18. #define absolute(i,j,k)  ( (i-j)*(k= ((i-j)<0 ? -1 : 1)))
  19.  
  20. int symwuline(a1,b1,a2,b2,color)
  21. int a1,b1,a2,b2,color;
  22. {
  23.  int    dx,dy,incr1,incr2,D,x,y,xend,c,pixels_left;
  24.  int    x1,y1;
  25.  int    sign_x,sign_y,step,reverse,i;
  26.  
  27. dx = absolute(a2,a1,sign_x);
  28. dy = absolute(b2,b1,sign_y);
  29.  
  30. /* decide increment sign by the slope sign*/
  31.  
  32. if (sign_x == sign_y)
  33.    step = 1;
  34. else
  35.    step = -1;
  36.  
  37. if (dy > dx)   /* chooses axis of greatest movement (make dx) */
  38.   {
  39.    swap(a1,b1);
  40.    swap(a2,b2);
  41.    swap(dx,dy);
  42.    reverse = 1;
  43.   }
  44. else
  45.    reverse = 0;
  46.  
  47. /*note error check for dx == 0 should be included here */
  48. if (a1 > a2)       /* start from the smaller coord */
  49.    {
  50.     x = a2;
  51.     y = b2;
  52.     x1 = a1;
  53.     y1 = b1;
  54.    }
  55. else      /* a2 >? a1 */
  56.    {
  57.     x = a1;
  58.     y = b1;
  59.     x1 = a2;
  60.     y1 = b2;
  61.    }
  62.  
  63. /* Note dx=n implies 0-n or (dx+1) pixels to be set */
  64.  
  65. xend = (dx-1)/4;
  66. pixels_left = (dx-1)%4;  /* # of pixels left over at the end */
  67.  
  68.  
  69. plot(x,y,reverse,color);        /* plot first 2 points */
  70. plot(x1,y1,reverse,color);
  71.  
  72. incr2 = 4*dy-2*dx;
  73.  
  74. if(incr2 < 0)  /* slope less than 1/2 */
  75.   {
  76.    c = 2*dy;
  77.    incr1 = 2*c;
  78.    D = incr1 - dx;
  79.  
  80.    for(i=0;i<xend;i++)       /* THE plotting loop */
  81.     {
  82.      ++x;
  83.      --x1;
  84.      if(D<0)  /* pattern 1 forwards */
  85.        {
  86.         plot(x,y,reverse,color);
  87.         plot(++x,y,reverse,color);
  88.               
  89.         plot(x1,y1,reverse,color);  /* plot pattern 1 backwards */
  90.         plot(--x1,y1,reverse,color);
  91.         D+=incr1;
  92.        }
  93.  
  94.       else
  95.       {
  96.         if(D<c)  /* pattern 2 forwards */
  97.        {
  98.         plot(x,y,reverse,color);
  99.         plot(++x,y+=step,reverse,color);
  100.               
  101.         plot(x1,y1,reverse,color);  /* plot pattern 2 backwards */
  102.         plot(--x1,y1-=step,reverse,color);
  103.        }
  104.         else
  105.         {
  106.                      /*pattern 3 forwards */
  107.        
  108.         plot(x,y+=step,reverse,color);
  109.         plot(++x,y,reverse,color);
  110.         plot(x1,y1-=step,reverse,color);  /* plot pattern 2 backwards */
  111.         plot(--x1,y1,reverse,color);
  112.        }
  113.       D+=incr2;
  114.     }        
  115.    }        /* end for */
  116.  
  117.  
  118. /* plot last pattern */
  119. if(pixels_left)
  120.    {
  121.       if(D<0)
  122.         {
  123.          plot(++x,y,reverse,color);   /*pattern 1*/
  124.          if (pixels_left > 1)
  125.           plot(++x,y,reverse,color);
  126.          if(pixels_left > 2)
  127.           plot(--x1,y1,reverse,color);
  128.         }
  129.       else
  130.        {
  131.         if(D<c)
  132.          {
  133.            plot(++x,y,reverse,color);   /*pattern 2*/
  134.            if(pixels_left > 1)
  135.             plot(++x,y+=step,reverse,color);
  136.            if(pixels_left > 2)
  137.             plot(--x1,y1,reverse,color);
  138.          }
  139.          else
  140.          {
  141.            plot(++x,y+=step,reverse,color);   /*pattern 3*/
  142.            if(pixels_left > 1)
  143.             plot(++x,y,reverse,color);
  144.            if(pixels_left > 2)
  145.             plot(--x1,y1-=step,reverse,color);
  146.          }
  147.        }
  148.      } /*end if pixels left */
  149.   } 
  150.    /* end slope < 1/2 */
  151.  
  152. else         /* else slope is > 1/2 */
  153.  {
  154.    c = 2*(dy-dx);
  155.    incr1 = 2*c;
  156.    D = incr1 + dx;
  157.  
  158.    for(i=0;i<xend;i++)       /* THE plotting loop */
  159.     {
  160.      ++x;
  161.      --x1;
  162.      if(D>0)  /* pattern 4 forwards */
  163.        {
  164.         plot(x,y+=step,reverse,color);
  165.         plot(++x,y+=step,reverse,color);
  166.               
  167.         plot(x1,y1-=step,reverse,color);  /* plot pattern 4 backwards */
  168.         plot(--x1,y1-=step,reverse,color);
  169.         D+=incr1;
  170.        }
  171.  
  172.       else
  173.       {
  174.         if(D<c)  /* pattern 2 forwards */
  175.        {
  176.         plot(x,y,reverse,color);
  177.         plot(++x,y+=step,reverse,color);
  178.               
  179.         plot(x1,y1,reverse,color);  /* plot pattern 2 backwards */
  180.         plot(--x1,y1-=step,reverse,color);
  181.        }
  182.         else
  183.         {
  184.                      /*pattern 3 forwards */
  185.        
  186.         plot(x,y+=step,reverse,color);
  187.         plot(++x,y,reverse,color);
  188.         plot(x1,y1-=step,reverse,color);  /* plot pattern 2 backwards */
  189.         plot(--x1,y1,reverse,color);
  190.        }
  191.       D+=incr2;
  192.     }        
  193.    }        /* end for */
  194.  
  195.  
  196. /* plot last pattern */
  197. if(pixels_left)
  198.    {
  199.       if(D>0)
  200.         {
  201.          plot(++x,y+=step,reverse,color);   /*pattern 4*/
  202.          if (pixels_left > 1)
  203.           plot(++x,y+=step,reverse,color);
  204.          if(pixels_left > 2)
  205.           plot(--x1,y1-=step,reverse,color);
  206.         }
  207.       else
  208.        {
  209.         if(D<c)
  210.          {
  211.            plot(++x,y,reverse,color);   /*pattern 2*/
  212.            if(pixels_left > 1)
  213.             plot(++x,y+=step,reverse,color);
  214.            if(pixels_left > 2)
  215.             plot(--x1,y1,reverse,color);
  216.          }
  217.          else
  218.          {
  219.            plot(++x,y+=step,reverse,color);   /*pattern 3*/
  220.            if(pixels_left > 1)
  221.             plot(++x,y,reverse,color);
  222.            if(pixels_left > 2)
  223.              {
  224.                if(D>c)  /*step 3*/
  225.                  plot(--x1,y1 -=step,reverse,color);
  226.                 else /*step 2*/
  227.                  plot(--x1,y1,reverse,color);
  228.               }
  229.        }
  230.      }
  231.   } 
  232.  }
  233. }
  234.  
  235.  
  236.  
  237.  
  238. /*******************************/
  239. /* non zero flag indicates the pixels needing swap back*/
  240. plot(x,y,flag,color)
  241. int x,y,flag,color;
  242. {
  243.  
  244.  
  245.  if(flag)
  246.   a_putpixel(y,x,color);
  247.   else  
  248.   a_putpixel(x,y,color);
  249. }
  250.